﻿using Student.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Student
{
    public partial class FormAddStudent : Form
    {
       
        /* 1 添加学生，把添加学生存储到本地  把一个对象储存到文本当中，但是不能直击存储对象，需要进行序列化和反序列化
        （就是字符串和对象转换的过程）
    * 2 把多个学生定义在一个数组里面 集合 List<>
    * 3 定义学生类 
    */

        // 构造函数
        public FormAddStudent()
        {
            InitializeComponent();
            //Student1 s1 = new Student1(); // 不能直接用 需要添加命名空间引用

            // 禁止自动生成列标题，
            this.dataGridView2.AutoGenerateColumns = false; 
        }

        public List<Student1> studentList = new List<Student1>();
        //点击确定添加按钮 把所有的学生信息放到一个数组里面
        private void button6_Click(object sender, EventArgs e)
        {
            // 1 数据验证 添加的学生信息符不符合要求 例如正则表达式
            if (this.textBox1.Text.Length==0) // 学生姓名不为空的判断
            {
                MessageBox.Show("学生姓名不能为空", "温馨提示");
                return;
            }
            //2 单选框必须有一个选中
            if(!this.radioButton1.Checked && !this.radioButton2.Checked)
            {
                MessageBox.Show("学生性别不能为空", "温馨提示");
                return;
            }
            //3 所在班级必选选一个 SelectedIndex 当前选中的索引值  ，==-1 没选中
            if (this.comboBox1.SelectedIndex == -1)
            {
                MessageBox.Show("学生班级不能为空", "温馨提示");
                return;
            }
            // 4 其他提示可以自己写 例如年龄必须在10-40之间
            // DateTime.Now.Year// 当前时间 取出年
            //  this.dateTimePicker1.Text // 时间选择器文本 字符串
            //Convert.ToDateTime 转成时间对象
            int age = DateTime.Now.Year - Convert.ToDateTime(this.dateTimePicker1.Text).Year;
            if(age<10 || age > 40)
            {
                MessageBox.Show("学生年龄不符合", "温馨提示");
                return;
            }

            // 5 添加到数组里面
            Student1 s1 = new Student1()
            { 
             StudentId = new Random().Next(1000, 1000000),
             StudentName = this.textBox1.Text,
            Gender = this.radioButton1.Checked ? "男" : "女",
            StudentBirth = this.dateTimePicker1.Text,
            StudentAge = age,
            StudentClassName = this.comboBox1.Text,
            StudentCarNum = this.textBox2.Text,  // 考勤
            StudentIdNum = this.textBox4.Text,// 身份证
            StudentPhoneNum = this.textBox5.Text, // 电话
            StudentAddress = this.textBox3.Text, // 地址
             };
            studentList.Add(s1);

            //6添加到表格里面 
            this.dataGridView2.DataSource = null; //添加数据源之前先清空 目的是为了防止重复添加
            this.dataGridView2.DataSource = studentList;  // DataSource 表格的数据源 可以直接等于一个数组
            //表格的每一列需要对应数据模型的哪个属性

            // this.dataGridView2.Rows.Add()
            //7  把studentList 存到本地  需要把本地取出来把本次学生添加在一起
            //List<Student1> big = new List<Student1>();
            //big = Student.Tools.SaveData.QuData("Students.obj") as List<Student1>; // 先从之前本地取出本地数据
            //big.AddRange(studentList); // 本次加的数据和之前本地取出本地数据 放到big数组里面
            //MessageBox.Show(big.Count + "");
            //Student.Tools.SaveData.Save("Students.obj", big);// 在把大数组存到本地 在其他从本地取得时候就是大数组

        }





        // 直接选择照片的方法
        private void button5_Click(object sender, EventArgs e)
        {
            // 1 显示一个对话框
            OpenFileDialog dlg = new OpenFileDialog();

            //2 设置选择文件的格式
            //Filter 过滤  只保留*.jpeg,*.png,*.gif
            dlg.Filter = "(*.jpeg,*.png,*.gif)|*.jpeg;*.jpg;*.png;*.gif";


            //3 
            DialogResult result = dlg.ShowDialog(); // 获取对话框的结果

            //4 如果点击了确定键
            if (result == DialogResult.OK)
            {
                //dlg.FileName 打开对话框文件路径
                this.pictureBox2.Image = Image.FromFile(dlg.FileName);
                // 设置图片的裁剪模式
                this.pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
            }
        }
        // 点击关闭窗口的按钮的方法
        private void button7_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //即将关闭的函数 存储学生list
        private void FormAddStudent_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 1 先把本地的取出来
            List<Student1> l1 = null;  // 保存本地的数据和本次添加的数据
            try
            {
                //Student.Tools 命名空间
                //SaveData 类
                //QuData 取出数据的方法
                l1 = Student.Tools.SaveData.QuData("Students.txt") as List<Student1>;  // 本地的数据
            }
            catch (Exception ex)
            {
                l1 = new List<Student1>(); // 第一次添加学生
            }

            // 2 把本地数据和本次添加的数据放在一起
            l1.AddRange(studentList);

            //3 存回本地
            Student.Tools.SaveData.Save("Students.txt", l1);

        }

        private void button8_Click(object sender, EventArgs e)
        {
            MessageBox.Show("郭天乐");
        }
    }
}

/*
 * 需要多个窗体中使用本地存储 需要封装一个工具类，把存入本地和取出数据封装成一个函数 放到工具类里面，需要
 * 用的时候 把工具类引入 再调用对应存取方法
 * studentList 存储到本地 集合存储的student1对象，不能直接储存对象到本地，必须把对象进行序列化之后在存储
 * 
 * 
 */